#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<sys/mman.h>
#include<unistd.h>

int *p = NULL;

void showbmp(char *picname)
{
    int fd;
    fd = open(picname, O_RDONLY);
    if (-1 == fd)
    {
        perror("open() fd failed!\n");
        return 0;
    }
    else
    {
        printf("open() fd success\n");
    }

    //解析头部数据
    char head[54] = {0};
    read(fd, &head, sizeof(head));
    int gao = *((int *)&head[18]);
    int kuan = *((int *)&head[22]);

    printf("gao = %d,kuan = %d\n",gao,kuan);



    int lcd_fd = open("/dev/fb0",O_RDWR);
    if (-1 == lcd_fd)
    {
        perror("open() lcd failed\n");
        return -1;
    }
    else
    {
        printf("open() lcd success\n");
    }

    p = mmap(NULL,800*480*4, PROT_READ|PROT_WRITE, MAP_SHARED,lcd_fd,0);

    //根据宽和高定义存放的像素数据的缓存区
    char buf[gao * kuan * 3];
    char buf32[gao * kuan * 4];
    char buffz[gao * kuan * 4];

    //偏移头部数据
    lseek(fd,54,SEEK_SET);

    //把图像的像素数据读入buf中
    read(fd, &buf, sizeof(buf));

    //开始转码
    int color;
    int x = 0, i = 0, y = 0;
    for (i = 0; i < gao; i++)
    {
        for ( x = 0; x < kuan; x++)
        {
            color = buf[2 + i * 4]  | (buf[1 + i * 4] << 8) | (buf[0 + i * 4] << 16);
            // printf("0x%02x\n",buf32[0 + i * 4]);
            // printf("0x%02x\n",buf32[1 + i * 4]);
            // printf("0x%02x\n",buf32[2 + i * 4]);
            printf("0x%06sx\n",color);
            *(p+gao*800+kuan) = color;
        } 
    }

    // //翻转算法
    // for (y = 0; y < 480; y++)
    // {
    //     for (x = 0; x < 800 * 4; x++)
    //     {
    //         buffz[800 * 4 * (479 - y) + x] = buf32[800 * 4 * y + x];
    //     }
    // }

    // //打开LCD屏幕
    // int lcd_fd;
    // lcd_fd = open("/dev/fb0",O_RDWR);
    // if (-1 == lcd_fd)
    // {
    //     perror("open() lcd failed!\n");
    //     return 0;
    // }
    // else
    // {
    //     printf("open() lcd success\n");
    // }

    // //写入像素
    // write(lcd_fd,buf32,sizeof(buffz));

    //关闭屏幕和图片
    close(lcd_fd);
    close(fd);
    
}

int main(int argc, char **argv)
{
    // while (1)
    // {
    //     showbmp("./photo/1.bmp");
    //     sleep(1);
    //     showbmp("./photo/4.bmp");
    //     sleep(1);
    //     showbmp("./photo/bbl.bmp");
    //     sleep(1);
    //     showbmp("./photo/kl.bmp");
    //     sleep(1);
    //     showbmp("./photo/qq.bmp");
    //     sleep(1);
    // }
    showbmp("./photo/xaiotu.bmp");
    return 0;
}
